package work.base.jvm.summary;

/**
 * java内存模型  Java Memory Model JMM
 *
 *
 * 1) 硬件层数据一致性
 * 存储器的层次结构
 * L0寄存器 > L1高速缓存 > L2高速缓存 > L3高速缓存 > CPU > L4内存 > L5磁盘 > L6远程文件存储
 * L0~L2 是在CPU内部 其他是CPU共享  由于L1和L2是CPU内部的 多核CPU就会有缓存数据不一致的问题
 * 多线程一致性的硬件层支持 是锁住总线 使得其他CPU不能访问内存 效率低 这是老的CPU的解决方案
 * 硬件层的数据一致性  现在一般都是使用MESI缓存一致性协议来解决  (MESI是硬件层次的)
 *      实际上就是给每个缓存的内容做了标记 标记四种状态(和主存内容对比的状态值) 实现各个CPU之间的缓存保持一致性
 * 现代CPU的数据一致性实现＝缓存锁(MESI)＋总线锁
 *
 * 缓存行 cache line：
 * 内存的数据放到缓存中 是以缓存行为单位的 基本的缓存单位  一般为64个字节
 * 导致的问题 一个CPU更改了缓存行其中一个变量x 会通知另外一个CPU会把整个缓存行(包含 x和y)重新读取一遍
 *            这种问题叫伪共享 位于同一缓存行的两个数据被两个CPU单独锁定 产生互相影响
 * 解决伪共享 ：使用缓存行对齐 使两个变量不在同一个缓存行 提高效率
 *
 * 2) 乱序
 * CPU为了提高效率 节省时间  把没有依赖关系的指令乱序执行 在一条读指令运行的同时执行另一条指令 前提使两条指令没有依赖关系
 * 如何保证不乱序执行 ：使
 * 用volatile 硬件层面 汇编指令lock comxchg
 *              CPU级别的内存屏障
 *                  sfence save写屏障 在sfence指令前的写操作必须在sfence指令后的写操作前完成  屏障两侧的指令不可以重排
 *                  lfence load读屏障
 *                  mfence
 *              jvm级别的内存屏障是CPU级别的内存屏障的组合
 * jvm的有序执行不一定依赖CPU级别的内存屏障 还可以依赖汇编的lock comxchg指令
 */
public class JMM {

    public static void main(String[] args) {


    }
}
